h1b_df <- DATA
SECTION 1: BACKGROUND
SLIDE 7: MAP
htmltools::includeHTML("rMaps.html")
SECTION 2: STEM
SLIDE 9: Stem and non-stem histogram
DATA %>%
group_by(year, stem) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n, fill = as.factor(stem))) +
geom_bar(stat = "identity", position = position_stack(reverse = FALSE), alpha = 0.8) +
scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
labs(y="\n Number", x="\n Year") +
scale_y_continuous(labels = function(x){paste0(x/1000, 'K')}) +
theme_minimal() +
theme(plot.title = element_text(hjust=0.5)) +
theme(legend.position = "top")

SLIDE 10: STEM and non-STEM boxplot: “Prevailing wage boxplot throughout years”
DATA %>%
filter(prevailing_wage >= 0 & prevailing_wage <= 600000) %>%
ggplot(aes(x = as.factor(year), y = prevailing_wage)) +
geom_boxplot(aes(fill=as.factor(stem)), outlier.shape = NA, alpha=0.9, color = "white") +
theme_minimal() +
labs(x = "\n Prevailing wage ($)", y = "Density \n") +
scale_y_continuous(labels = function(x){paste0(x / 1000, "K")}) +
scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
coord_cartesian(ylim = c(40000, 100000))

SLIDE 11: Stem and non-stem prevailing wage distribution in 2018
DATA %>%
filter(year == 2018) %>%
filter(prevailing_wage >= 0 & prevailing_wage <= 400000) %>%
ggplot(aes(x = prevailing_wage, color = as.factor(stem), fill = as.factor(stem))) +
geom_density(adjust = 2, alpha = 0.7)+
theme_classic() +
labs(x = "\n Prevailing wage ($)", y = expression(Density~(10^{-3})), title = "Distribution of prevailing wage in 2018") +
scale_x_continuous(labels = function(x){paste0(x/1000, 'K')}) +
scale_y_continuous(labels = function(x){paste0(x * 1000, "")}) +
scale_color_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
scale_fill_manual(values = c("#00B2E4", "#0F2A48"), name = "", labels = c("non-STEM", "STEM")) +
theme(plot.title = element_text(hjust=0.5)) +
theme_minimal()

SLIDE 12 AND 13: bar plot: stem jobs
dt <- DATA %>%
mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "senior systems analyst jc60"), "senior systems analyst", job_title)) %>%
filter(stem == 1)
#
# dt %>%
# filter(year == 2017) %>%
# group_by(job_title) %>%
# summarise(n = n()) %>%
# arrange(-n) %>%
# slice(1:20) %>%
# mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
# arrange(n) %>%
# ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
# labs(y = "Number of Aplications", x = "Job Titles") +
# theme_minimal()
dt %>%
filter(year == 2018) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
arrange(n) %>%
ggbarplot("job_title", "n", fill = "cat", palette = c("#FC2967", "#00B2E4"), alpha = 0.8, orientation = "horiz", color = "white") +
labs(y = "Number of Aplications", x = "Job Titles")+
theme_minimal()+
theme(
legend.position = "none"
) +
theme(panel.grid.major.y = element_blank())

# original
dt %>%
filter(year == 2018) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
mutate(cat = ifelse(str_detect(job_title, "analyst|data"), "data", "non-data")) %>%
arrange(n) %>%
ggbarplot("job_title", "n", fill = "#00B2E4", alpha = 0.8, orientation = "horiz", color = "white") +
labs(y = "Number of Aplications", x = "Job Titles") +
theme_minimal()+
theme(panel.grid.major.y = element_blank())

Slide 15
dt <- DATA %>%
filter(data_job_title %in% c("Business Analyst","Data Engineer","Data Analyst", "Data Scientist")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
arrange(-n)
p1 <- dt %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2)+
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "Applications Data related jobs", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal() +
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))
p1

slide 16
filtered_job <- DATA %>%
filter(data_job_title %in% c("Business Analyst","Data Engineer", "Data Scientist","Data Analyst"))
filtered_job$data_job_title <- factor(filtered_job$data_job_title, levels = c("Data Analyst", "Business Analyst", "Data Engineer", "Data Scientist"), ordered = TRUE)
filtered_job %>% group_by(data_job_title) %>% summarise(mean = mean(prevailing_wage))
filtered_job %>%
ggplot(aes(y = prevailing_wage, x = data_job_title)) +
geom_boxplot(fill = "#00B2E4", outlier.shape = NA, color = "white", width = 0.5) +
coord_cartesian(ylim = c(50000, 120000)) +
theme_minimal() +
labs(x = "\n Job title", y = "Prevailing wage (per year) \n", title = "Prevailing wages in data related jobs") +
theme(plot.title = element_text(size = 1),
text = element_text(size = 12),
axis.title = element_text(size = 16),
axis.text.x= element_text(size = 10),
axis.text.y = element_text(size = 10)) +
theme(plot.title = element_text(hjust = 0.5))

Slide 17

Slide 17
Top Tech Companies and Their Trends
soc_top_tech <- c("Apple",
"Microsoft",
"Amazon",
"Facebook",
"Google",
"IBM")
DATA %>%
filter(data_job_title %in% c("Business Analyst","Data Engineer","Data Analyst", "Data Scientist")) %>%
mutate(employer_name = ifelse(str_detect(employer_name,'apple'), 'Apple',
ifelse(str_detect(employer_name,'microsoft'), 'Microsoft',
ifelse(str_detect(employer_name,'amazon'),'Amazon',
ifelse(str_detect(employer_name,'facebook'),'Facebook',
ifelse(str_detect(employer_name,'google'),'Google',
ifelse(str_detect(employer_name, 'ibm'),'IBM','no'))))))) %>%
group_by(employer_name, year) %>%
summarise(tot = n()) %>%
filter(!employer_name %in% c("no", NA)) %>%
ungroup()%>%
ggplot()+
scale_color_brewer(palette = "RdBu") +
geom_line(aes(x = year, y = tot, color = employer_name), size = 1.5)+
labs( y = "Number of Applications", x = "Year", color = "Employer")+
theme_minimal()

Data jobs in top companies
filtered_job_all <- DATA %>%
filter(data_job_title %in% c("Business Analyst","Data Analyst", "Data Engineer", "Data Scientist")) %>%
mutate(employer_name = ifelse(str_detect(employer_name,'apple'), 'Apple',
ifelse(str_detect(employer_name,'microsoft'), 'Microsoft',
ifelse(str_detect(employer_name,'amazon'),'Amazon',
ifelse(str_detect(employer_name,'facebook'),'Facebook',
ifelse(str_detect(employer_name,'google'),'Google',
ifelse(str_detect(employer_name, 'ibm'),'IBM',employer_name)))))))
#IBM
top_com <- DATA %>%
filter(data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")) %>%
group_by(employer_name) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
ungroup()
top_com <-top_com$employer_name
ibm_data <- DATA %>%
filter( str_detect(employer_name, "ibm")) %>%
group_by(job_title, year) %>%
summarise(n = n())%>%
mutate(data_job_title =
ifelse(str_detect(job_title,"business")&(str_detect(job_title,"analyst")|str_detect(job_title, "intelligence")),
"Business Analyst",
NA)) %>%
mutate(data_job_title =
ifelse(str_detect(job_title, "data")&(str_detect(job_title,"engineer")|str_detect(job_title, "warehouse")),
"Data Engineer",
data_job_title)) %>%
mutate(data_job_title =
ifelse(str_detect(job_title, "data")&str_detect(job_title, "scientist"),
"Data Scientist",
data_job_title)) %>%
mutate(data_job_title =
ifelse(str_detect(job_title, "data")&str_detect(job_title, "analyst|analytics"),
"Data Analyst",
data_job_title)) %>%
mutate(data_job_title =
ifelse(str_detect(job_title, "machine|deep")&str_detect(job_title, "learning"),
"Data Scientist",
data_job_title)) %>%
mutate(data_job_title =
ifelse(str_detect(job_title, "product")&str_detect(job_title, "analyst|engineer|data"),
"Data Analyst",
data_job_title)) %>%
mutate(data_job_title =
ifelse(str_detect(job_title, "product")&str_detect(job_title, "manager"),
"Product Manager",
data_job_title))
con=c("infosys limited", "deloitte consulting llp","amazon","facebook", "ibm")
myColor <- c("#465881", "#FFB6C1", "#00909e", "#00B2E4", "#FC2967")
# c(amazon, "deloitte", "#facebook", "ibm", "info")
ggplot(ibm_data, aes(x = year, y = n, group = job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(x = "Year",
y = "Number",
col = "") +
theme_classic()+
geom_line(data = subset(ibm_data, data_job_title %in% c("Business Analyst", "Data Analyst", "Data Engineer", "Data Scientist")),aes(col=data_job_title),size=1.2)+
theme(plot.title = element_text(size = 14),
text = element_text(size = 12),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11),
legend.position = "top",)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
ylim(0,150)

filtered_job_all %>%
filter(employer_name == 'IBM') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

NA
NA
Infosys
filtered_job_all %>%
filter(str_detect(employer_name, 'infosys')) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
#axis.text = element_text(size = 15),
#axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Microsoft
filtered_job_all %>%
filter(employer_name == 'Microsoft') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Amazon
filtered_job_all %>%
filter(employer_name == 'Amazon') %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Deloitte
filtered_job_all %>%
filter(str_detect(employer_name, "deloitte")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Facebook
filtered_job_all %>%
filter(str_detect(employer_name, "Facebook")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Apple
filtered_job_all %>%
filter(str_detect(employer_name, "Apple")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Google
filtered_job_all %>%
filter(str_detect(employer_name, "Google")) %>%
group_by(data_job_title, year) %>%
summarise(n = n()) %>%
ggplot(aes(x = year, y = n))+
#geom_point(aes(color = data_job_title), size = 2) +
geom_line(aes(color = data_job_title),size = 1.2)+
labs( y = "", x = "Year", title = "", face = "bold", size = 14)+
scale_color_manual(values=c("#FC2967","#465881", "#00909e", "#00B2E4"), name = "") +
theme_minimal()+
theme(legend.position = "top",
axis.text = element_text(size = 15),
axis.title.x = element_text(size = 15)
) +
theme(plot.title = element_text(hjust=0.5))

Facebook
h1b_facebook <- h1b_df %>%
filter(employer_name == 'facebook') %>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software engineer","Data Engineer",'research scientist')
ggplot(h1b_facebook, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Facebook",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_facebook, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11))+
scale_color_discrete(labels = c("Data Engineer", "Data Scientist", "Research Scientist","Software Engineer"))

Amazon
h1b_amazon <- h1b_df %>%
filter(str_detect(employer_name,'amazon')) %>%
ungroup(data_job_title) %>%
mutate(job_title=ifelse(str_detect(data_job_title,'software development engineer'), 'software development engineer',
ifelse(str_detect(data_job_title,'technical program manager'), 'technical program manager',data_job_title)))%>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software development engineer","business analyst","Data Engineer","technical program manager")
ggplot(h1b_amazon, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Amazon",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_amazon, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11)) +
scale_color_discrete(labels = c("Business Analyst", "Data Engineer", "Data Scientist","Software Development Engineer","Technical Program Manager"))

Microsoft
h1b_micro <- h1b_df %>%
filter(str_detect(employer_name,'microsoft')) %>%
ungroup(data_job_title) %>%
mutate(job_title=ifelse(str_detect(data_job_title,'software engineer|software development engineer'), 'software engineer',
ifelse(str_detect(data_job_title,'program manager'), 'program manager',data_job_title))) %>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software engineer","program manager")
ggplot(h1b_micro, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Microsoft",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_micro, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11)) +
scale_color_discrete(labels = c("Data Scientist","Program Manager","Software Engineer"))

Google
h1b_google <- h1b_df %>%
filter(str_detect(employer_name,'google'))
h1b_google <- h1b_google %>%
ungroup(job_title) %>%
mutate(job_title=ifelse(str_detect(job_title,'software engineer'), 'software engineer',
ifelse(str_detect(job_title,'hardware engineer'), 'hardware engineer',job_title))) %>%
group_by(job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Data Scientist","software engineer","program manager","product manager","business analyst")
ggplot(h1b_google, aes(x = year, y = n, group = job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Google",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_google, job_title %in% con),aes(col=job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11)) +
scale_color_discrete(labels = c("Business Analyst", "Data Scientist","Product Manager","Program Manager", "Software Engineer"))

IBM
h1b_ibm <- h1b_df %>%
filter(str_detect(employer_name,'ibm'))
h1b_ibm <- h1b_ibm %>%
ungroup(job_title) %>%
mutate(job_title=ifelse(str_detect(job_title,'software engineer'), 'software engineer',
ifelse(str_detect(job_title,'hardware engineer'), 'hardware engineer',job_title))) %>%
group_by(job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("consultant","application developer","it specialist","software engineer","project manager")
ggplot(h1b_ibm, aes(x = year, y = n, group = job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in IBM",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_minimal()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_ibm, job_title %in% con),aes(col=job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11))

Uber
h1b_uber <- h1b_df %>%
filter(str_detect(employer_name,'uber')) %>%
ungroup(data_job_title) %>%
mutate(data_job_title=ifelse(str_detect(data_job_title,'software engineer'), 'Software Engineer',
data_job_title)) %>%
group_by(data_job_title,year) %>%
summarise(n=n()) %>%
arrange(-n)
con=c("Software Engineer","Data Scientist","Data Analyst")
ggplot(h1b_uber, aes(x = year, y = n, group = data_job_title)) +
geom_line(alpha = 0.3,
size = 0.2) +
labs(title = "H1B in Uber",
x = "Year",
y = "Number",
col = 'Job Title') +
theme_light()+
theme(plot.title = element_text(hjust = 0.5))+
geom_line(data = subset(h1b_uber, data_job_title %in% con),aes(col=data_job_title),size=0.7)+
theme(plot.title = element_text(size = 14, family = "Helvetica", face = "bold"),
text = element_text(size = 12, family = "Helvetica"),
axis.title = element_text(face="bold"),
axis.text.x=element_text(size = 11))

Alluvia
filtered_job <- DATA %>%
filter(year == 2018) %>%
filter(data_job_title %in% c("Business Analyst","Data Analyst","Data Engineer", "Data Scientist"))
top_10_state <- filtered_job %>%
group_by(worksite_state_abb) %>%
summarise(count = n()) %>%
arrange(desc(count)) %>%
slice(1:10)
flows <- filtered_job %>%
filter(worksite_state_abb %in% top_10_state$worksite_state_abb) %>%
group_by(data_job_title,
worksite_state_abb) %>%
summarise(count = n())
ggplot(flows, aes(y =count, axis1=data_job_title, axis2=worksite_state_abb)) +
geom_alluvium(aes(fill = data_job_title)) +
geom_stratum(width = 1/8, fill = "#0F2A48", color = "grey", alpha = 0.9) +
geom_label(stat = "stratum", label.strata = TRUE) +
labs(x="",y="")+
theme_minimal()+
theme(legend.position = "top") +
scale_fill_manual(values =c("#FC2967","#465881", "#00909e", "#00B2E4"), name=NULL)+
scale_x_discrete(limits = c("Job title", "State"), expand = c(.05, .05)) +
theme(axis.text.x=element_text(size = 12, face = "bold"))+
theme(line = element_blank())

bar plot:stem program in different job titles
DATA %>%
mutate(job_title = ifelse(str_detect(job_title, "business")& (str_detect(job_title, "analyst")|str_detect(job_title, "intelligence")) , "business analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& (str_detect(job_title, "engineer")|str_detect(job_title, "warehouse")), "data engineer", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "scientist"), "data scientist", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "data")& str_detect(job_title, "analyst|analytics"), "data analyst", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "machine|deep")& str_detect(job_title, "learning"), "deep learning & machine learning", job_title)) %>%
mutate(job_title = ifelse(str_detect(job_title, "product") & str_detect(job_title, "analyst|engineer|data"), "data product analyst", job_title)) %>%
filter(year == 2018) %>%
filter(stem == 1) %>%
group_by(job_title) %>%
summarise(n = n()) %>%
arrange(-n) %>%
slice(1:20) %>%
ggbarplot("job_title", "n", fill = "#00B2E4", color = "white", alpha = 0.8, sort.val = "asc", orientation = "horiz") %>%
labs(title = "stem program")
[[1]]
$title
[1] "stem program"
attr(,"class")
[1] "labels"

MAP - data job with the highest number in each city
ggplot(points) +
geom_sf(data = state_maps, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 0.1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
legend.position = c(0,0), legend.justification = c(0,0))+
labs(x = "", y = "", title = "")

ggplot(points_ca) +
geom_sf(data = state_maps_ca, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

ggplot(points_northeast) +
geom_sf(data = state_maps_northeast, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

ggplot(points_midwest) +
geom_sf(data = state_maps_midwest, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon,100), y = jitter(lat,100), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

ggplot(points_tn) +
geom_sf(data = state_maps_tn, color = "white", fill = "lightgrey",alpha=0.5) +
geom_point(aes(x = jitter(lon), y = jitter(lat), color = max_job), size = 1, alpha = 0.5) +
scale_color_manual(values = c("Business Analyst" = "#00B2E4",
"Data Analyst" = "#0F2A48",
"Data Engineer" = "#008B8B",
"Data Scientist" = "#FC2967"),
name = "Job Title") +
theme(panel.background = element_blank(),
legend.background = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
#legend.position = c(0,0), legend.justification = c(0,0)
)+
labs(x = "", y = "", title = "")

LS0tCnRpdGxlOiAiRmluYWxfUmVwb3J0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmgxYl9kZiA8LSBEQVRBCmBgYAoKCiMgU0VDVElPTiAxOiBCQUNLR1JPVU5ECiMgU0xJREUgNzogTUFQCgpgYGB7cn0KaHRtbHRvb2xzOjppbmNsdWRlSFRNTCgick1hcHMuaHRtbCIpCmBgYAoKIyBTRUNUSU9OIDI6IFNURU0KIyBTTElERSA5OiBTdGVtIGFuZCBub24tc3RlbSBoaXN0b2dyYW0KYGBge3IgZmlnLmhlaWdodD0yLjYsIGZpZy53aWR0aD0yLjN9CkRBVEEgJT4lCiAgZ3JvdXBfYnkoeWVhciwgc3RlbSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGZpbGwgPSBhcy5mYWN0b3Ioc3RlbSkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2socmV2ZXJzZSA9IEZBTFNFKSwgYWxwaGEgPSAwLjgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBsYWJzKHk9IlxuIE51bWJlciIsIHg9IlxuIFllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KXtwYXN0ZTAoeC8xMDAwLCAnSycpfSkgKyAKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgoKIyBTTElERSAxMDogU1RFTSBhbmQgbm9uLVNURU0gYm94cGxvdDogIlByZXZhaWxpbmcgd2FnZSBib3hwbG90IHRocm91Z2hvdXQgeWVhcnMiCmBgYHtyfQpEQVRBICU+JQogIGZpbHRlcihwcmV2YWlsaW5nX3dhZ2UgPj0gMCAmIHByZXZhaWxpbmdfd2FnZSA8PSA2MDAwMDApICU+JQogIGdncGxvdChhZXMoeCA9IGFzLmZhY3Rvcih5ZWFyKSwgeSA9IHByZXZhaWxpbmdfd2FnZSkpICsKICBnZW9tX2JveHBsb3QoYWVzKGZpbGw9YXMuZmFjdG9yKHN0ZW0pKSwgb3V0bGllci5zaGFwZSA9IE5BLCBhbHBoYT0wLjksIGNvbG9yID0gIndoaXRlIikgKwogIHRoZW1lX21pbmltYWwoKSArCiBsYWJzKHggPSAiXG4gUHJldmFpbGluZyB3YWdlICgkKSIsIHkgPSAiRGVuc2l0eSBcbiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHggLyAxMDAwLCAiSyIpfSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDBCMkU0IiwgIiMwRjJBNDgiKSwgbmFtZSA9ICIiLCBsYWJlbHMgPSBjKCJub24tU1RFTSIsICJTVEVNIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoNDAwMDAsIDEwMDAwMCkpCmBgYAoKCiMgU0xJREUgMTE6IFN0ZW0gYW5kIG5vbi1zdGVtIHByZXZhaWxpbmcgd2FnZSBkaXN0cmlidXRpb24gaW4gMjAxOApgYGB7cn0KREFUQSAlPiUKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUKICBmaWx0ZXIocHJldmFpbGluZ193YWdlID49IDAgJiBwcmV2YWlsaW5nX3dhZ2UgPD0gNDAwMDAwKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcHJldmFpbGluZ193YWdlLCBjb2xvciA9IGFzLmZhY3RvcihzdGVtKSwgZmlsbCA9IGFzLmZhY3RvcihzdGVtKSkpICsKICBnZW9tX2RlbnNpdHkoYWRqdXN0ID0gMiwgYWxwaGEgPSAwLjcpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4ID0gIlxuIFByZXZhaWxpbmcgd2FnZSAoJCkiLCB5ID0gZXhwcmVzc2lvbihEZW5zaXR5figxMF57LTN9KSksIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBwcmV2YWlsaW5nIHdhZ2UgaW4gMjAxOCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHgvMTAwMCwgJ0snKX0pICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCl7cGFzdGUwKHggKiAxMDAwLCAiIil9KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLCBuYW1lID0gIiIsIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEIyRTQiLCAiIzBGMkE0OCIpLCBuYW1lID0gIiIsIGxhYmVscyA9IGMoIm5vbi1TVEVNIiwgIlNURU0iKSkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgojIFNMSURFIDEyIEFORCAxMzogYmFyIHBsb3Q6IHN0ZW0gam9icwpgYGB7cn0KZHQgPC0gREFUQSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImJ1c2luZXNzIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3QiKXxzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImludGVsbGlnZW5jZSIpKSAsICJidXNpbmVzcyBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIChzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImVuZ2luZWVyIil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJ3YXJlaG91c2UiKSksICJkYXRhIGVuZ2luZWVyIiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAic2NpZW50aXN0IiksICJkYXRhIHNjaWVudGlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImFuYWx5c3R8YW5hbHl0aWNzIiksICJkYXRhIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIm1hY2hpbmV8ZGVlcCIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksICJkZWVwIGxlYXJuaW5nICYgbWFjaGluZSBsZWFybmluZyIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpICYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGVuZ2luZWVyfGRhdGEiKSwgImRhdGEgcHJvZHVjdCBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJzZW5pb3Igc3lzdGVtcyBhbmFseXN0IGpjNjAiKSwgInNlbmlvciBzeXN0ZW1zIGFuYWx5c3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgZmlsdGVyKHN0ZW0gPT0gMSkKIyAKIyBkdCAlPiUgCiMgICBmaWx0ZXIoeWVhciA9PSAyMDE3KSAlPiUgCiMgICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKIyAgIHN1bW1hcmlzZShuID0gbigpKSAlPiUKIyAgIGFycmFuZ2UoLW4pICU+JSAKIyAgIHNsaWNlKDE6MjApICU+JSAKIyAgIG11dGF0ZShjYXQgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGRhdGEiKSwgImRhdGEiLCAibm9uLWRhdGEiKSkgJT4lCiMgICBhcnJhbmdlKG4pICU+JSAKIyAgIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gImNhdCIsIHBhbGV0dGUgPSBjKCIjRkMyOTY3IiwgIiMwMEIyRTQiKSwgYWxwaGEgPSAwLjgsIG9yaWVudGF0aW9uID0gImhvcml6IiwgY29sb3IgPSAid2hpdGUiKSArCiMgICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikgKwojICAgdGhlbWVfbWluaW1hbCgpCgpkdCAlPiUgCiAgZmlsdGVyKHllYXIgPT0gMjAxOCkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIG11dGF0ZShjYXQgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGRhdGEiKSwgImRhdGEiLCAibm9uLWRhdGEiKSkgJT4lCiAgYXJyYW5nZShuKSAlPiUgCiAgZ2diYXJwbG90KCJqb2JfdGl0bGUiLCAibiIsIGZpbGwgPSAiY2F0IiwgcGFsZXR0ZSA9IGMoIiNGQzI5NjciLCAiIzAwQjJFNCIpLCBhbHBoYSA9IDAuOCwgb3JpZW50YXRpb24gPSAiaG9yaXoiLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikrCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiCiAgKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKCiMgb3JpZ2luYWwKZHQgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgYXJyYW5nZSgtbikgJT4lIAogIHNsaWNlKDE6MjApICU+JSAKICBtdXRhdGUoY2F0ID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxkYXRhIiksICJkYXRhIiwgIm5vbi1kYXRhIikpICU+JQogIGFycmFuZ2UobikgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gIiMwMEIyRTQiLCBhbHBoYSA9IDAuOCwgb3JpZW50YXRpb24gPSAiaG9yaXoiLCBjb2xvciA9ICJ3aGl0ZSIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEFwbGljYXRpb25zIiwgeCA9ICJKb2IgVGl0bGVzIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyBTbGlkZSAxNQpgYGB7cixmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQpkdCA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsIkRhdGEgQW5hbHlzdCIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGFycmFuZ2UoLW4pIAoKcDEgPC0gZHQgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIkFwcGxpY2F0aW9ucyBEYXRhIHJlbGF0ZWQgam9icyIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCnAxCmBgYAoKIyBzbGlkZSAxNgoKYGBge3J9CmZpbHRlcmVkX2pvYiA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIsIkRhdGEgQW5hbHlzdCIpKQoKCmZpbHRlcmVkX2pvYiRkYXRhX2pvYl90aXRsZSA8LSBmYWN0b3IoZmlsdGVyZWRfam9iJGRhdGFfam9iX3RpdGxlLCBsZXZlbHMgPSBjKCJEYXRhIEFuYWx5c3QiLCAiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IiksIG9yZGVyZWQgPSBUUlVFKQoKCmZpbHRlcmVkX2pvYiAlPiUgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4ocHJldmFpbGluZ193YWdlKSkKZmlsdGVyZWRfam9iICU+JSAgCiAgZ2dwbG90KGFlcyh5ID0gcHJldmFpbGluZ193YWdlLCB4ID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiIzAwQjJFNCIsIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAid2hpdGUiLCB3aWR0aCA9IDAuNSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyg1MDAwMCwgMTIwMDAwKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh4ID0gIlxuIEpvYiB0aXRsZSIsIHkgPSAiUHJldmFpbGluZyB3YWdlIChwZXIgeWVhcikgXG4iLCB0aXRsZSA9ICJQcmV2YWlsaW5nIHdhZ2VzIGluIGRhdGEgcmVsYXRlZCBqb2JzIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0Lng9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKYGBgCgoKIyBTbGlkZSAxNwpgYGB7cn0KCnRvcF9jb20gPC0gREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIHVuZ3JvdXAoKQoKdG9wX2NvbSA8LXRvcF9jb20kZW1wbG95ZXJfbmFtZSAKCnNwYV9kYXRhIDwtIERBVEEgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICVpbiUgdG9wX2NvbSkgJT4lIAogIGZpbHRlcihlbXBsb3llcl9uYW1lICE9ICJjYXBnZW1pbmkgYW1lcmljYSBpbmMiKSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSAlPiUKICBncm91cF9ieShlbXBsb3llcl9uYW1lLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpIAoKY29uPWMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpCm15Q29sb3IgPC0gYygiIzQ2NTg4MSIsICIjRkZCNkMxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIsICIjRkMyOTY3IikKCiMgYyhhbWF6b24sICJkZWxvaXR0ZSIsICIjZmFjZWJvb2siLCAiaWJtIiwgImluZm8iKQoKZ2dwbG90KHNwYV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGVtcGxveWVyX25hbWUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnMoeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICIiKSArCiAgdGhlbWVfY2xhc3NpYygpKwogIGdlb21fbGluZShkYXRhID0gc3Vic2V0KHNwYV9kYXRhLCBlbXBsb3llcl9uYW1lICVpbiUgY29uKSxhZXMoY29sPWVtcGxveWVyX25hbWUpLHNpemU9MS4yKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IG15Q29sb3IsIGJyZWFrcyA9IGMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpLCBsYWJlbHMgPSBjKCJJbmZvc3lzIExpbWl0ZWQiLCAiRGVsb2l0dGUgQ29uc3VsdGluZyIsIkFtYXpvbiIsIkZhY2Vib29rIiwgIklCTSIpKSAgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmBgYAoKCiMgU2xpZGUgMTcKIyBUb3AgVGVjaCBDb21wYW5pZXMgYW5kIFRoZWlyIFRyZW5kcwpgYGB7cn0Kc29jX3RvcF90ZWNoIDwtIGMoIkFwcGxlIiwKICAgICAgICAgICAgICAgICAgIk1pY3Jvc29mdCIsCiAgICAgICAgICAgICAgICAgICJBbWF6b24iLAogICAgICAgICAgICAgICAgICAiRmFjZWJvb2siLAogICAgICAgICAgICAgICAgICAiR29vZ2xlIiwKICAgICAgICAgICAgICAgICAgIklCTSIpCgoKREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsIkRhdGEgRW5naW5lZXIiLCJEYXRhIEFuYWx5c3QiLCAiRGF0YSBTY2llbnRpc3QiKSkgJT4lIAogIG11dGF0ZShlbXBsb3llcl9uYW1lID0gaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYXBwbGUnKSwgJ0FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdtaWNyb3NvZnQnKSwgJ01pY3Jvc29mdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnYW1hem9uJyksJ0FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnZmFjZWJvb2snKSwnRmFjZWJvb2snLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2dvb2dsZScpLCdHb29nbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICdpYm0nKSwnSUJNJywnbm8nKSkpKSkpKSAlPiUgCiAgZ3JvdXBfYnkoZW1wbG95ZXJfbmFtZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZSh0b3QgPSBuKCkpICU+JSAKICBmaWx0ZXIoIWVtcGxveWVyX25hbWUgJWluJSBjKCJubyIsIE5BKSkgJT4lIAogIHVuZ3JvdXAoKSU+JSAKICBnZ3Bsb3QoKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJSZEJ1IikgKwogIGdlb21fbGluZShhZXMoeCA9IHllYXIsIHkgPSB0b3QsIGNvbG9yID0gZW1wbG95ZXJfbmFtZSksIHNpemUgPSAxLjUpKwogIGxhYnMoIHkgPSAiTnVtYmVyIG9mIEFwcGxpY2F0aW9ucyIsIHggPSAiWWVhciIsIGNvbG9yID0gIkVtcGxveWVyIikrCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKCgojIERhdGEgam9icyBpbiB0b3AgY29tcGFuaWVzIApgYGB7cn0KCmZpbHRlcmVkX2pvYl9hbGwgPC0gREFUQSAlPiUgCiAgZmlsdGVyKGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsIkRhdGEgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IikpICU+JSAKICBtdXRhdGUoZW1wbG95ZXJfbmFtZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2FwcGxlJyksICdBcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnbWljcm9zb2Z0JyksICdNaWNyb3NvZnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2FtYXpvbicpLCdBbWF6b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2ZhY2Vib29rJyksJ0ZhY2Vib29rJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdnb29nbGUnKSwnR29vZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaWJtJyksJ0lCTScsZW1wbG95ZXJfbmFtZSkpKSkpKSkgCiAgCmBgYAoKI0lCTQoKCgpgYGB7cn0KdG9wX2NvbSA8LSBEQVRBICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwgIkRhdGEgQW5hbHlzdCIsICJEYXRhIEVuZ2luZWVyIiwgIkRhdGEgU2NpZW50aXN0IikpICU+JQogIGdyb3VwX2J5KGVtcGxveWVyX25hbWUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGFycmFuZ2UoLW4pICU+JSAKICBzbGljZSgxOjIwKSAlPiUgCiAgdW5ncm91cCgpCgp0b3BfY29tIDwtdG9wX2NvbSRlbXBsb3llcl9uYW1lIAoKaWJtX2RhdGEgPC0gREFUQSAlPiUgCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJpYm0iKSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsImJ1c2luZXNzIikmKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSksIAogICAgICAgICAgICAgICAgICAiQnVzaW5lc3MgQW5hbHlzdCIsIAogICAgICAgICAgICAgICAgICBOQSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLAogICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIsIAogICAgICAgICAgICAgICAgICBkYXRhX2pvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmc3RyX2RldGVjdChqb2JfdGl0bGUsICJzY2llbnRpc3QiKSwgCiAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIsIAogICAgICAgICAgICAgICAgICBkYXRhX2pvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJkYXRhIikmc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLCAKICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIsIAogICAgICAgICAgICAgICAgICBkYXRhX2pvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGUgPSAKICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSZzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImxlYXJuaW5nIiksIAogICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiLCAKICAgICAgICAgICAgICAgICAgZGF0YV9qb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGRhdGFfam9iX3RpdGxlID0gCiAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAicHJvZHVjdCIpJnN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksIAogICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiwgCiAgICAgICAgICAgICAgICAgIGRhdGFfam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShkYXRhX2pvYl90aXRsZSA9IAogICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSZzdHJfZGV0ZWN0KGpvYl90aXRsZSwgIm1hbmFnZXIiKSwgCiAgICAgICAgICAgICAgICAgICJQcm9kdWN0IE1hbmFnZXIiLCAKICAgICAgICAgICAgICAgICAgZGF0YV9qb2JfdGl0bGUpKQoKY29uPWMoImluZm9zeXMgbGltaXRlZCIsICJkZWxvaXR0ZSBjb25zdWx0aW5nIGxscCIsImFtYXpvbiIsImZhY2Vib29rIiwgImlibSIpCm15Q29sb3IgPC0gYygiIzQ2NTg4MSIsICIjRkZCNkMxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIsICIjRkMyOTY3IikKCiMgYyhhbWF6b24sICJkZWxvaXR0ZSIsICIjZmFjZWJvb2siLCAiaWJtIiwgImluZm8iKQoKZ2dwbG90KGlibV9kYXRhLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGpvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gIiIpICsKICB0aGVtZV9jbGFzc2ljKCkrCiAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaWJtX2RhdGEsIGRhdGFfam9iX3RpdGxlICVpbiUgYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIEFuYWx5c3QiLCAiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTEuMikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZSA9IDExKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHlsaW0oMCwxNTApCmBgYAoKCgoKCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnSUJNJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCgoKYGBgCgojIEluZm9zeXMKYGBge3J9CgpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAnaW5mb3N5cycpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICAjYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgI2F4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQoKYGBgCgojIE1pY3Jvc29mdApgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKGVtcGxveWVyX25hbWUgPT0gJ01pY3Jvc29mdCcpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMgQW1hem9uCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnQW1hem9uJykgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBEZWxvaXR0ZQpgYGB7cn0KZmlsdGVyZWRfam9iX2FsbCAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwgImRlbG9pdHRlIikpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwgeWVhcikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4pKSsKICAjZ2VvbV9wb2ludChhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSxzaXplID0gMS4yKSsKICBsYWJzKCB5ID0gIiIsIHggPSAiWWVhciIsIHRpdGxlID0gIiIsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNCkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZSA9ICIiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpCiAgICAgICAgKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUpKQpgYGAKCiMgRmFjZWJvb2sKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJGYWNlYm9vayIpKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUsIHllYXIpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuKSkrCiAgI2dlb21fcG9pbnQoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLCBzaXplID0gMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBkYXRhX2pvYl90aXRsZSksc2l6ZSA9IDEuMikrCiAgbGFicyggeSA9ICIiLCB4ID0gIlllYXIiLCB0aXRsZSA9ICIiLCBmYWNlID0gImJvbGQiLCBzaXplID0gMTQpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZDMjk2NyIsIiM0NjU4ODEiLCAiIzAwOTA5ZSIsICIjMDBCMkU0IiksIG5hbWUgPSAiIikgKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KQogICAgICAgICkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3Q9MC41KSkKYGBgCgojIEFwcGxlCmBgYHtyfQpmaWx0ZXJlZF9qb2JfYWxsICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCAiQXBwbGUiKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyBHb29nbGUKYGBge3J9CmZpbHRlcmVkX2pvYl9hbGwgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsICJHb29nbGUiKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbikpKwogICNnZW9tX3BvaW50KGFlcyhjb2xvciA9IGRhdGFfam9iX3RpdGxlKSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZGF0YV9qb2JfdGl0bGUpLHNpemUgPSAxLjIpKwogIGxhYnMoIHkgPSAiIiwgeCA9ICJZZWFyIiwgdGl0bGUgPSAiIiwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE0KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGQzI5NjciLCIjNDY1ODgxIiwgIiMwMDkwOWUiLCAiIzAwQjJFNCIpLCBuYW1lID0gIiIpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkKICAgICAgICApICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpCmBgYAoKIyMgRmFjZWJvb2sKCmBgYHtyfQpoMWJfZmFjZWJvb2sgPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoZW1wbG95ZXJfbmFtZSA9PSAnZmFjZWJvb2snKSAlPiUgCiAgZ3JvdXBfYnkoZGF0YV9qb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCiAgCmBgYAoKCgpgYGB7cn0KY29uPWMoIkRhdGEgU2NpZW50aXN0Iiwic29mdHdhcmUgZW5naW5lZXIiLCJEYXRhIEVuZ2luZWVyIiwncmVzZWFyY2ggc2NpZW50aXN0JykKZ2dwbG90KGgxYl9mYWNlYm9vaywgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gRmFjZWJvb2siLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl9mYWNlYm9vaywgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKGxhYmVscyA9IGMoIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiLCAiUmVzZWFyY2ggU2NpZW50aXN0IiwiU29mdHdhcmUgRW5naW5lZXIiKSkKCmBgYAoKIyMgQW1hem9uCgpgYGB7cn0KCmgxYl9hbWF6b24gPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdhbWF6b24nKSkgJT4lIAogIHVuZ3JvdXAoZGF0YV9qb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlPWlmZWxzZShzdHJfZGV0ZWN0KGRhdGFfam9iX3RpdGxlLCdzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbmdpbmVlcicpLCAnc29mdHdhcmUgZGV2ZWxvcG1lbnQgZW5naW5lZXInLCAKICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGRhdGFfam9iX3RpdGxlLCd0ZWNobmljYWwgcHJvZ3JhbSBtYW5hZ2VyJyksICd0ZWNobmljYWwgcHJvZ3JhbSBtYW5hZ2VyJyxkYXRhX2pvYl90aXRsZSkpKSU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKCmBgYAoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGRldmVsb3BtZW50IGVuZ2luZWVyIiwiYnVzaW5lc3MgYW5hbHlzdCIsIkRhdGEgRW5naW5lZXIiLCJ0ZWNobmljYWwgcHJvZ3JhbSBtYW5hZ2VyIikKZ2dwbG90KGgxYl9hbWF6b24sIGFlcyh4ID0geWVhciwgeSA9IG4sIGdyb3VwID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIEFtYXpvbiIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX2FtYXpvbiwgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiwgIkRhdGEgRW5naW5lZXIiLCAiRGF0YSBTY2llbnRpc3QiLCJTb2Z0d2FyZSBEZXZlbG9wbWVudCBFbmdpbmVlciIsIlRlY2huaWNhbCBQcm9ncmFtIE1hbmFnZXIiKSkKYGBgCgoKIyMgTWljcm9zb2Z0CgpgYGB7cn0KaDFiX21pY3JvIDwtIGgxYl9kZiAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoZW1wbG95ZXJfbmFtZSwnbWljcm9zb2Z0JykpICU+JSAKICB1bmdyb3VwKGRhdGFfam9iX3RpdGxlKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZT1pZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXJ8c29mdHdhcmUgZGV2ZWxvcG1lbnQgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGVuZ2luZWVyJywgCiAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChkYXRhX2pvYl90aXRsZSwncHJvZ3JhbSBtYW5hZ2VyJyksICdwcm9ncmFtIG1hbmFnZXInLGRhdGFfam9iX3RpdGxlKSkpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKICAKYGBgCgpgYGB7cn0KY29uPWMoIkRhdGEgU2NpZW50aXN0Iiwic29mdHdhcmUgZW5naW5lZXIiLCJwcm9ncmFtIG1hbmFnZXIiKQpnZ3Bsb3QoaDFiX21pY3JvLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGRhdGFfam9iX3RpdGxlKSkgKwogIGdlb21fbGluZShhbHBoYSA9IDAuMywgCiAgICAgICAgICAgIHNpemUgPSAwLjIpICsKICBsYWJzKHRpdGxlID0gIkgxQiBpbiBNaWNyb3NvZnQiLAogICAgICAgeCA9ICJZZWFyIiwKICAgICAgIHkgPSAiTnVtYmVyIiwKICAgICAgIGNvbCA9ICdKb2IgVGl0bGUnKSArCiAgdGhlbWVfbGlnaHQoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgIGdlb21fbGluZShkYXRhID0gc3Vic2V0KGgxYl9taWNybywgZGF0YV9qb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9ZGF0YV9qb2JfdGl0bGUpLHNpemU9MC43KSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIkhlbHZldGljYSIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiSGVsdmV0aWNhIiksCiAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksCiAgICAgICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShsYWJlbHMgPSBjKCJEYXRhIFNjaWVudGlzdCIsIlByb2dyYW0gTWFuYWdlciIsIlNvZnR3YXJlIEVuZ2luZWVyIikpCmBgYAoKCiMjIEdvb2dsZQoKYGBge3J9CmgxYl9nb29nbGUgPC0gaDFiX2RmICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChlbXBsb3llcl9uYW1lLCdnb29nbGUnKSkgCiAgCmBgYAoKYGBge3J9CmgxYl9nb29nbGUgPC0gaDFiX2dvb2dsZSAlPiUgCiAgdW5ncm91cChqb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlPWlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwnc29mdHdhcmUgZW5naW5lZXInKSwgJ3NvZnR3YXJlIGVuZ2luZWVyJywKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsJ2hhcmR3YXJlIGVuZ2luZWVyJyksICdoYXJkd2FyZSBlbmdpbmVlcicsam9iX3RpdGxlKSkpICU+JSAKICBncm91cF9ieShqb2JfdGl0bGUseWVhcikgJT4lIAogIHN1bW1hcmlzZShuPW4oKSkgJT4lIAogIGFycmFuZ2UoLW4pCmBgYAoKYGBge3J9CmNvbj1jKCJEYXRhIFNjaWVudGlzdCIsInNvZnR3YXJlIGVuZ2luZWVyIiwicHJvZ3JhbSBtYW5hZ2VyIiwicHJvZHVjdCBtYW5hZ2VyIiwiYnVzaW5lc3MgYW5hbHlzdCIpCmdncGxvdChoMWJfZ29vZ2xlLCBhZXMoeCA9IHllYXIsIHkgPSBuLCBncm91cCA9IGpvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gR29vZ2xlIiwKICAgICAgIHggPSAiWWVhciIsCiAgICAgICB5ID0gIk51bWJlciIsCiAgICAgICBjb2wgPSAnSm9iIFRpdGxlJykgKwogIHRoZW1lX2xpZ2h0KCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfZ29vZ2xlLCBqb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9am9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobGFiZWxzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIsICJEYXRhIFNjaWVudGlzdCIsIlByb2R1Y3QgTWFuYWdlciIsIlByb2dyYW0gTWFuYWdlciIsICJTb2Z0d2FyZSBFbmdpbmVlciIpKQpgYGAKCgojIyBJQk0gCgpgYGB7cn0KaDFiX2libSA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ2libScpKSAKICAKYGBgCgpgYGB7cn0KaDFiX2libSA8LSBoMWJfaWJtICU+JSAKICB1bmdyb3VwKGpvYl90aXRsZSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCdzb2Z0d2FyZSBlbmdpbmVlcicpLCAnc29mdHdhcmUgZW5naW5lZXInLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwnaGFyZHdhcmUgZW5naW5lZXInKSwgJ2hhcmR3YXJlIGVuZ2luZWVyJyxqb2JfdGl0bGUpKSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSx5ZWFyKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpKSAlPiUgCiAgYXJyYW5nZSgtbikKYGBgCgpgYGB7cn0KY29uPWMoImNvbnN1bHRhbnQiLCJhcHBsaWNhdGlvbiBkZXZlbG9wZXIiLCJpdCBzcGVjaWFsaXN0Iiwic29mdHdhcmUgZW5naW5lZXIiLCJwcm9qZWN0IG1hbmFnZXIiKQpnZ3Bsb3QoaDFiX2libSwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBqb2JfdGl0bGUpKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC4zLCAKICAgICAgICAgICAgc2l6ZSA9IDAuMikgKwogIGxhYnModGl0bGUgPSAiSDFCIGluIElCTSIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogICBnZW9tX2xpbmUoZGF0YSA9IHN1YnNldChoMWJfaWJtLCBqb2JfdGl0bGUgJWluJSBjb24pLGFlcyhjb2w9am9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKQpgYGAKCiMjIFViZXIKCmBgYHtyfQpoMWJfdWJlciA8LSBoMWJfZGYgJT4lIAogIGZpbHRlcihzdHJfZGV0ZWN0KGVtcGxveWVyX25hbWUsJ3ViZXInKSkgJT4lIAogIHVuZ3JvdXAoZGF0YV9qb2JfdGl0bGUpICU+JSAKICBtdXRhdGUoZGF0YV9qb2JfdGl0bGU9aWZlbHNlKHN0cl9kZXRlY3QoZGF0YV9qb2JfdGl0bGUsJ3NvZnR3YXJlIGVuZ2luZWVyJyksICdTb2Z0d2FyZSBFbmdpbmVlcicsIAogICAgICAgIGRhdGFfam9iX3RpdGxlKSkgJT4lIAogIGdyb3VwX2J5KGRhdGFfam9iX3RpdGxlLHllYXIpICU+JSAKICBzdW1tYXJpc2Uobj1uKCkpICU+JSAKICBhcnJhbmdlKC1uKQpgYGAKCmBgYHtyfQpjb249YygiU29mdHdhcmUgRW5naW5lZXIiLCJEYXRhIFNjaWVudGlzdCIsIkRhdGEgQW5hbHlzdCIpCmdncGxvdChoMWJfdWJlciwgYWVzKHggPSB5ZWFyLCB5ID0gbiwgZ3JvdXAgPSBkYXRhX2pvYl90aXRsZSkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjMsIAogICAgICAgICAgICBzaXplID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJIMUIgaW4gVWJlciIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgeSA9ICJOdW1iZXIiLAogICAgICAgY29sID0gJ0pvYiBUaXRsZScpICsKICB0aGVtZV9saWdodCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICAgZ2VvbV9saW5lKGRhdGEgPSBzdWJzZXQoaDFiX3ViZXIsIGRhdGFfam9iX3RpdGxlICVpbiUgY29uKSxhZXMoY29sPWRhdGFfam9iX3RpdGxlKSxzaXplPTAuNykrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJIZWx2ZXRpY2EiLCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFtaWx5ID0gIkhlbHZldGljYSIpLAogICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTEpKQpgYGAKCgojIyBBbGx1dmlhCmBgYHtyLGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTIuN30KZmlsdGVyZWRfam9iIDwtIERBVEEgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSAKICBmaWx0ZXIoZGF0YV9qb2JfdGl0bGUgJWluJSBjKCJCdXNpbmVzcyBBbmFseXN0IiwiRGF0YSBBbmFseXN0IiwiRGF0YSBFbmdpbmVlciIsICJEYXRhIFNjaWVudGlzdCIpKQoKCnRvcF8xMF9zdGF0ZSA8LSBmaWx0ZXJlZF9qb2IgJT4lIAogIGdyb3VwX2J5KHdvcmtzaXRlX3N0YXRlX2FiYikgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIAogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JSAKICBzbGljZSgxOjEwKSAKCmZsb3dzIDwtIGZpbHRlcmVkX2pvYiAlPiUgCiAgZmlsdGVyKHdvcmtzaXRlX3N0YXRlX2FiYiAlaW4lIHRvcF8xMF9zdGF0ZSR3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JSAKICBncm91cF9ieShkYXRhX2pvYl90aXRsZSwKICAgICAgICAgICB3b3Jrc2l0ZV9zdGF0ZV9hYmIpICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKCgpnZ3Bsb3QoZmxvd3MsIGFlcyh5ID1jb3VudCwgYXhpczE9ZGF0YV9qb2JfdGl0bGUsIGF4aXMyPXdvcmtzaXRlX3N0YXRlX2FiYikpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gZGF0YV9qb2JfdGl0bGUpKSArCiAgZ2VvbV9zdHJhdHVtKHdpZHRoID0gMS84LCBmaWxsID0gIiMwRjJBNDgiLCBjb2xvciA9ICJncmV5IiwgYWxwaGEgPSAwLjkpICsKICBnZW9tX2xhYmVsKHN0YXQgPSAic3RyYXR1bSIsIGxhYmVsLnN0cmF0YSA9IFRSVUUpICsKICBsYWJzKHg9IiIseT0iIikrCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID1jKCIjRkMyOTY3IiwiIzQ2NTg4MSIsICIjMDA5MDllIiwgIiMwMEIyRTQiKSwgbmFtZT1OVUxMKSsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkpvYiB0aXRsZSIsICJTdGF0ZSIpLCBleHBhbmQgPSBjKC4wNSwgLjA1KSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpKSsKICB0aGVtZShsaW5lID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgojIyBiYXIgcGxvdDpzdGVtIHByb2dyYW0gaW4gZGlmZmVyZW50IGpvYiB0aXRsZXMKYGBge3J9CkRBVEEgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJidXNpbmVzcyIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0Iil8c3RyX2RldGVjdChqb2JfdGl0bGUsICJpbnRlbGxpZ2VuY2UiKSkgLCAiYnVzaW5lc3MgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiAoc3RyX2RldGVjdChqb2JfdGl0bGUsICJlbmdpbmVlciIpfHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAid2FyZWhvdXNlIikpLCAiZGF0YSBlbmdpbmVlciIsIGpvYl90aXRsZSkpICU+JSAKICBtdXRhdGUoam9iX3RpdGxlID0gaWZlbHNlKHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiZGF0YSIpJiBzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInNjaWVudGlzdCIpLCAiZGF0YSBzY2llbnRpc3QiLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgImRhdGEiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJhbmFseXN0fGFuYWx5dGljcyIpLCAiZGF0YSBhbmFseXN0Iiwgam9iX3RpdGxlKSkgJT4lIAogIG11dGF0ZShqb2JfdGl0bGUgPSBpZmVsc2Uoc3RyX2RldGVjdChqb2JfdGl0bGUsICJtYWNoaW5lfGRlZXAiKSYgc3RyX2RldGVjdChqb2JfdGl0bGUsICJsZWFybmluZyIpLCAiZGVlcCBsZWFybmluZyAmIG1hY2hpbmUgbGVhcm5pbmciLCBqb2JfdGl0bGUpKSAlPiUgCiAgbXV0YXRlKGpvYl90aXRsZSA9IGlmZWxzZShzdHJfZGV0ZWN0KGpvYl90aXRsZSwgInByb2R1Y3QiKSAmIHN0cl9kZXRlY3Qoam9iX3RpdGxlLCAiYW5hbHlzdHxlbmdpbmVlcnxkYXRhIiksICJkYXRhIHByb2R1Y3QgYW5hbHlzdCIsIGpvYl90aXRsZSkpICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDE4KSAlPiUgCiAgZmlsdGVyKHN0ZW0gPT0gMSkgJT4lIAogIGdyb3VwX2J5KGpvYl90aXRsZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBhcnJhbmdlKC1uKSAlPiUgCiAgc2xpY2UoMToyMCkgJT4lIAogIGdnYmFycGxvdCgiam9iX3RpdGxlIiwgIm4iLCBmaWxsID0gIiMwMEIyRTQiLCBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44LCBzb3J0LnZhbCA9ICJhc2MiLCBvcmllbnRhdGlvbiA9ICJob3JpeiIpICU+JSAKICBsYWJzKHRpdGxlID0gInN0ZW0gcHJvZ3JhbSIpCmBgYAoKIyBNQVAgLSBkYXRhIGpvYiB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBpbiBlYWNoIGNpdHkgCmBgYHtyfQpnZ3Bsb3QocG9pbnRzKSArIAogIGdlb21fc2YoZGF0YSA9IHN0YXRlX21hcHMsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uLDEwMCksIHkgPSBqaXR0ZXIobGF0LDEwMCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAwLjEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkpKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfY2EpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwc19jYSwgY29sb3IgPSAid2hpdGUiLCBmaWxsID0gImxpZ2h0Z3JleSIsYWxwaGE9MC41KSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGppdHRlcihsb24pLCB5ID0gaml0dGVyKGxhdCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c19ub3J0aGVhc3QpICsgCiAgZ2VvbV9zZihkYXRhID0gc3RhdGVfbWFwc19ub3J0aGVhc3QsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uKSwgeSA9IGppdHRlcihsYXQpLCBjb2xvciA9IG1heF9qb2IpLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJ1c2luZXNzIEFuYWx5c3QiID0gIiMwMEIyRTQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBBbmFseXN0IiA9ICIjMEYyQTQ4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmdpbmVlciIgPSAiIzAwOEI4QiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgU2NpZW50aXN0IiA9ICIjRkMyOTY3IiksCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiSm9iIFRpdGxlIikgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgI2xlZ2VuZC5wb3NpdGlvbiA9IGMoMCwwKSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsMCkKICAgICAgICApKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIHRpdGxlID0gIiIpCmBgYAoKYGBge3J9CmdncGxvdChwb2ludHNfbWlkd2VzdCkgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX21pZHdlc3QsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJsaWdodGdyZXkiLGFscGhhPTAuNSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBqaXR0ZXIobG9uLDEwMCksIHkgPSBqaXR0ZXIobGF0LDEwMCksIGNvbG9yID0gbWF4X2pvYiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQnVzaW5lc3MgQW5hbHlzdCIgPSAiIzAwQjJFNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEFuYWx5c3QiID0gIiMwRjJBNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuZ2luZWVyIiA9ICIjMDA4QjhCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBTY2llbnRpc3QiID0gIiNGQzI5NjciKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJKb2IgVGl0bGUiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjbGVnZW5kLnBvc2l0aW9uID0gYygwLDApLCBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwwKQogICAgICAgICkrCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgdGl0bGUgPSAiIikKYGBgCgpgYGB7cn0KZ2dwbG90KHBvaW50c190bikgKyAKICBnZW9tX3NmKGRhdGEgPSBzdGF0ZV9tYXBzX3RuLCBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAibGlnaHRncmV5IixhbHBoYT0wLjUpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaml0dGVyKGxvbiksIHkgPSBqaXR0ZXIobGF0KSwgY29sb3IgPSBtYXhfam9iKSwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCdXNpbmVzcyBBbmFseXN0IiA9ICIjMDBCMkU0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgQW5hbHlzdCIgPSAiIzBGMkE0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5naW5lZXIiID0gIiMwMDhCOEIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhIFNjaWVudGlzdCIgPSAiI0ZDMjk2NyIpLAogICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkpvYiBUaXRsZSIpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICNsZWdlbmQucG9zaXRpb24gPSBjKDAsMCksIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLDApCiAgICAgICAgKSsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCB0aXRsZSA9ICIiKQpgYGA=